using System.ComponentModel;

namespace Bogus
{
   /// <summary>
   /// Static class for holding character string constants.
   /// </summary>
   public static class Chars
   {
      /// <summary>
      /// Lower case, a-z.
      /// </summary>
      public const string LowerCase = "abcdefghijklmnopqrstuvwxyz";

      /// <summary>
      /// Upper case, A-Z.
      /// </summary>
      public const string UpperCase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

      /// <summary>
      /// Numbers, 0-9.
      /// </summary>
      public const string Numbers = "0123456789";

      /// <summary>
      /// Hexadecimal, 0-9 and a-f.
      /// </summary>
      public const string HexLowerCase = Numbers + "abcdef";

      /// <summary>
      /// Hexadecimal, 0-9 and A-F.
      /// </summary>
      public const string HexUpperCase = Numbers + "ABCDEF";


      /// <summary>
      /// Alphanumeric upper case 0-9 and A-Z.
      /// </summary>
      public const string AlphaNumericUpperCase = Numbers + UpperCase;
      
      /// <summary>
      /// Alphanumeric lower case 0-9 and a-z.
      /// </summary>
      public const string AlphaNumericLowerCase = Numbers + LowerCase;
   }

   /// <summary>
   /// Contains information about contiguous blocks of unicode character ranges.
   /// </summary>
   [EditorBrowsable(EditorBrowsableState.Never)]
   public static class SafeUnicodeRanges
   {
      /// <summary>
      /// Contiguous blocks of unicode scalars that are not surrogates and where
      /// char.IsLetterOrDigit is true.
      /// </summary>
      public static string[] Basic = {
            "\u0030-\u0039",
            "\u0041-\u005A",
            "\u0061-\u007A",
            "\u00C0-\u00D6",
            "\u00D8-\u00F6",
            "\u00F8-\u02C1",
            "\u02C6-\u02D1",
            "\u02E0-\u02E4",
            "\u037A-\u037D",
            "\u0388-\u038A",
            "\u038E-\u03A1",
            "\u03A3-\u03CE",
            "\u03D0-\u03F5",
            "\u03F7-\u0481",
            "\u048A-\u0513",
            "\u0531-\u0556",
            "\u0561-\u0587",
            "\u05D0-\u05EA",
            "\u05F0-\u05F2",
            "\u0621-\u063A",
            "\u0640-\u064A",
            "\u0660-\u0669",
            "\u066E-\u066F",
            "\u0671-\u06D3",
            "\u06E5-\u06E6",
            "\u06EE-\u06FC",
            "\u0712-\u072F",
            "\u074D-\u076D",
            "\u0780-\u07A5",
            "\u07C0-\u07EA",
            "\u07F4-\u07F5",
            "\u0904-\u0939",
            "\u0958-\u0961",
            "\u0966-\u096F",
            "\u097B-\u097F",
            "\u0985-\u098C",
            "\u098F-\u0990",
            "\u0993-\u09A8",
            "\u09AA-\u09B0",
            "\u09B6-\u09B9",
            "\u09DC-\u09DD",
            "\u09DF-\u09E1",
            "\u09E6-\u09F1",
            "\u0A05-\u0A0A",
            "\u0A0F-\u0A10",
            "\u0A13-\u0A28",
            "\u0A2A-\u0A30",
            "\u0A32-\u0A33",
            "\u0A35-\u0A36",
            "\u0A38-\u0A39",
            "\u0A59-\u0A5C",
            "\u0A66-\u0A6F",
            "\u0A72-\u0A74",
            "\u0A85-\u0A8D",
            "\u0A8F-\u0A91",
            "\u0A93-\u0AA8",
            "\u0AAA-\u0AB0",
            "\u0AB2-\u0AB3",
            "\u0AB5-\u0AB9",
            "\u0AE0-\u0AE1",
            "\u0AE6-\u0AEF",
            "\u0B05-\u0B0C",
            "\u0B0F-\u0B10",
            "\u0B13-\u0B28",
            "\u0B2A-\u0B30",
            "\u0B32-\u0B33",
            "\u0B35-\u0B39",
            "\u0B5C-\u0B5D",
            "\u0B5F-\u0B61",
            "\u0B66-\u0B6F",
            "\u0B85-\u0B8A",
            "\u0B8E-\u0B90",
            "\u0B92-\u0B95",
            "\u0B99-\u0B9A",
            "\u0B9E-\u0B9F",
            "\u0BA3-\u0BA4",
            "\u0BA8-\u0BAA",
            "\u0BAE-\u0BB9",
            "\u0BE6-\u0BEF",
            "\u0C05-\u0C0C",
            "\u0C0E-\u0C10",
            "\u0C12-\u0C28",
            "\u0C2A-\u0C33",
            "\u0C35-\u0C39",
            "\u0C60-\u0C61",
            "\u0C66-\u0C6F",
            "\u0C85-\u0C8C",
            "\u0C8E-\u0C90",
            "\u0C92-\u0CA8",
            "\u0CAA-\u0CB3",
            "\u0CB5-\u0CB9",
            "\u0CE0-\u0CE1",
            "\u0CE6-\u0CEF",
            "\u0CF1-\u0CF2",
            "\u0D05-\u0D0C",
            "\u0D0E-\u0D10",
            "\u0D12-\u0D28",
            "\u0D2A-\u0D39",
            "\u0D60-\u0D61",
            "\u0D66-\u0D6F",
            "\u0D85-\u0D96",
            "\u0D9A-\u0DB1",
            "\u0DB3-\u0DBB",
            "\u0DC0-\u0DC6",
            "\u0E01-\u0E30",
            "\u0E32-\u0E33",
            "\u0E40-\u0E46",
            "\u0E50-\u0E59",
            "\u0E81-\u0E82",
            "\u0E87-\u0E88",
            "\u0E94-\u0E97",
            "\u0E99-\u0E9F",
            "\u0EA1-\u0EA3",
            "\u0EAA-\u0EAB",
            "\u0EAD-\u0EB0",
            "\u0EB2-\u0EB3",
            "\u0EC0-\u0EC4",
            "\u0ED0-\u0ED9",
            "\u0EDC-\u0EDD",
            "\u0F20-\u0F29",
            "\u0F40-\u0F47",
            "\u0F49-\u0F6A",
            "\u0F88-\u0F8B",
            "\u1000-\u1021",
            "\u1023-\u1027",
            "\u1029-\u102A",
            "\u1040-\u1049",
            "\u1050-\u1055",
            "\u10A0-\u10C5",
            "\u10D0-\u10FA",
            "\u1100-\u1159",
            "\u115F-\u11A2",
            "\u11A8-\u11F9",
            "\u1200-\u1248",
            "\u124A-\u124D",
            "\u1250-\u1256",
            "\u125A-\u125D",
            "\u1260-\u1288",
            "\u128A-\u128D",
            "\u1290-\u12B0",
            "\u12B2-\u12B5",
            "\u12B8-\u12BE",
            "\u12C2-\u12C5",
            "\u12C8-\u12D6",
            "\u12D8-\u1310",
            "\u1312-\u1315",
            "\u1318-\u135A",
            "\u1380-\u138F",
            "\u13A0-\u13F4",
            "\u1401-\u166C",
            "\u166F-\u1676",
            "\u1681-\u169A",
            "\u16A0-\u16EA",
            "\u1700-\u170C",
            "\u170E-\u1711",
            "\u1720-\u1731",
            "\u1740-\u1751",
            "\u1760-\u176C",
            "\u176E-\u1770",
            "\u1780-\u17B3",
            "\u17E0-\u17E9",
            "\u1810-\u1819",
            "\u1820-\u1877",
            "\u1880-\u18A8",
            "\u1900-\u191C",
            "\u1946-\u196D",
            "\u1970-\u1974",
            "\u1980-\u19A9",
            "\u19B0-\u19C9",
            "\u19D0-\u19D9",
            "\u1A00-\u1A16",
            "\u1B05-\u1B33",
            "\u1B45-\u1B4B",
            "\u1B50-\u1B59",
            "\u1D00-\u1DBF",
            "\u1E00-\u1E9B",
            "\u1EA0-\u1EF9",
            "\u1F00-\u1F15",
            "\u1F18-\u1F1D",
            "\u1F20-\u1F45",
            "\u1F48-\u1F4D",
            "\u1F50-\u1F57",
            "\u1F5F-\u1F7D",
            "\u1F80-\u1FB4",
            "\u1FB6-\u1FBC",
            "\u1FC2-\u1FC4",
            "\u1FC6-\u1FCC",
            "\u1FD0-\u1FD3",
            "\u1FD6-\u1FDB",
            "\u1FE0-\u1FEC",
            "\u1FF2-\u1FF4",
            "\u1FF6-\u1FFC",
            "\u2090-\u2094",
            "\u210A-\u2113",
            "\u2119-\u211D",
            "\u212A-\u212D",
            "\u212F-\u2139",
            "\u213C-\u213F",
            "\u2145-\u2149",
            "\u2183-\u2184",
            "\u2C00-\u2C2E",
            "\u2C30-\u2C5E",
            "\u2C60-\u2C6C",
            "\u2C74-\u2C77",
            "\u2C80-\u2CE4",
            "\u2D00-\u2D25",
            "\u2D30-\u2D65",
            "\u2D80-\u2D96",
            "\u2DA0-\u2DA6",
            "\u2DA8-\u2DAE",
            "\u2DB0-\u2DB6",
            "\u2DB8-\u2DBE",
            "\u2DC0-\u2DC6",
            "\u2DC8-\u2DCE",
            "\u2DD0-\u2DD6",
            "\u2DD8-\u2DDE",
            "\u3005-\u3006",
            "\u3031-\u3035",
            "\u303B-\u303C",
            "\u3041-\u3096",
            "\u309D-\u309F",
            "\u30A1-\u30FA",
            "\u30FC-\u30FF",
            "\u3105-\u312C",
            "\u3131-\u318E",
            "\u31A0-\u31B7",
            "\u31F0-\u31FF",
            "\u3400-\u4DB5",
            "\u4E00-\u9FBB",
            "\uA000-\uA48C",
            "\uA717-\uA71A",
            "\uA800-\uA801",
            "\uA803-\uA805",
            "\uA807-\uA80A",
            "\uA80C-\uA822",
            "\uA840-\uA873",
            "\uAC00-\uD7A3",
            "\uF900-\uFA2D",
            "\uFA30-\uFA6A",
            "\uFA70-\uFAD9",
            "\uFB00-\uFB06",
            "\uFB13-\uFB17",
            "\uFB1F-\uFB28",
            "\uFB2A-\uFB36",
            "\uFB38-\uFB3C",
            "\uFB40-\uFB41",
            "\uFB43-\uFB44",
            "\uFB46-\uFBB1",
            "\uFBD3-\uFD3D",
            "\uFD50-\uFD8F",
            "\uFD92-\uFDC7",
            "\uFDF0-\uFDFB",
            "\uFE70-\uFE74",
            "\uFE76-\uFEFC",
            "\uFF10-\uFF19",
            "\uFF21-\uFF3A",
            "\uFF41-\uFF5A",
            "\uFF66-\uFFBE",
            "\uFFC2-\uFFC7",
            "\uFFCA-\uFFCF",
            "\uFFD2-\uFFD7",
            "\uFFDA-\uFFDC",
         };

      /// <summary>
      /// Contiguous blocks of unicode surrogate pairs and where
      /// char.IsLetterOrDigit is true.
      /// </summary>
      public static string[] SurrogatePairs =
         {
            "\uD800\uDC00-\uD800\uDC0B",
            "\uD800\uDC0D-\uD800\uDC26",
            "\uD800\uDC28-\uD800\uDC3A",
            "\uD800\uDC3C-\uD800\uDC3D",
            "\uD800\uDC3F-\uD800\uDC4D",
            "\uD800\uDC50-\uD800\uDC5D",
            "\uD800\uDC80-\uD800\uDCFA",
            "\uD800\uDF00-\uD800\uDF1E",
            "\uD800\uDF30-\uD800\uDF40",
            "\uD800\uDF42-\uD800\uDF49",
            "\uD800\uDF80-\uD800\uDF9D",
            "\uD800\uDFA0-\uD800\uDFC3",
            "\uD800\uDFC8-\uD800\uDFCF",
            "\uD801\uDC00-\uD801\uDC9D",
            "\uD801\uDCA0-\uD801\uDCA9",
            "\uD802\uDC00-\uD802\uDC05",
            "\uD802\uDC0A-\uD802\uDC35",
            "\uD802\uDC37-\uD802\uDC38",
            "\uD802\uDD00-\uD802\uDD15",
            "\uD802\uDE10-\uD802\uDE13",
            "\uD802\uDE15-\uD802\uDE17",
            "\uD802\uDE19-\uD802\uDE33",
            "\uD808\uDC00-\uD808\uDF6E",
            "\uD835\uDC00-\uD835\uDC54",
            "\uD835\uDC56-\uD835\uDC9C",
            "\uD835\uDC9E-\uD835\uDC9F",
            "\uD835\uDCA5-\uD835\uDCA6",
            "\uD835\uDCA9-\uD835\uDCAC",
            "\uD835\uDCAE-\uD835\uDCB9",
            "\uD835\uDCBD-\uD835\uDCC3",
            "\uD835\uDCC5-\uD835\uDD05",
            "\uD835\uDD07-\uD835\uDD0A",
            "\uD835\uDD0D-\uD835\uDD14",
            "\uD835\uDD16-\uD835\uDD1C",
            "\uD835\uDD1E-\uD835\uDD39",
            "\uD835\uDD3B-\uD835\uDD3E",
            "\uD835\uDD40-\uD835\uDD44",
            "\uD835\uDD4A-\uD835\uDD50",
            "\uD835\uDD52-\uD835\uDEA5",
            "\uD835\uDEA8-\uD835\uDEC0",
            "\uD835\uDEC2-\uD835\uDEDA",
            "\uD835\uDEDC-\uD835\uDEFA",
            "\uD835\uDEFC-\uD835\uDF14",
            "\uD835\uDF16-\uD835\uDF34",
            "\uD835\uDF36-\uD835\uDF4E",
            "\uD835\uDF50-\uD835\uDF6E",
            "\uD835\uDF70-\uD835\uDF88",
            "\uD835\uDF8A-\uD835\uDFA8",
            "\uD835\uDFAA-\uD835\uDFC2",
            "\uD835\uDFC4-\uD835\uDFCB",
            "\uD835\uDFCE-\uD835\uDFFF",
            "\uD840\uDC00-\uD840\uDFFF",
            "\uD841\uDC00-\uD841\uDFFF",
            "\uD842\uDC00-\uD842\uDFFF",
            "\uD843\uDC00-\uD843\uDFFF",
            "\uD844\uDC00-\uD844\uDFFF",
            "\uD845\uDC00-\uD845\uDFFF",
            "\uD846\uDC00-\uD846\uDFFF",
            "\uD847\uDC00-\uD847\uDFFF",
            "\uD848\uDC00-\uD848\uDFFF",
            "\uD849\uDC00-\uD849\uDFFF",
            "\uD84A\uDC00-\uD84A\uDFFF",
            "\uD84B\uDC00-\uD84B\uDFFF",
            "\uD84C\uDC00-\uD84C\uDFFF",
            "\uD84D\uDC00-\uD84D\uDFFF",
            "\uD84E\uDC00-\uD84E\uDFFF",
            "\uD84F\uDC00-\uD84F\uDFFF",
            "\uD850\uDC00-\uD850\uDFFF",
            "\uD851\uDC00-\uD851\uDFFF",
            "\uD852\uDC00-\uD852\uDFFF",
            "\uD853\uDC00-\uD853\uDFFF",
            "\uD854\uDC00-\uD854\uDFFF",
            "\uD855\uDC00-\uD855\uDFFF",
            "\uD856\uDC00-\uD856\uDFFF",
            "\uD857\uDC00-\uD857\uDFFF",
            "\uD858\uDC00-\uD858\uDFFF",
            "\uD859\uDC00-\uD859\uDFFF",
            "\uD85A\uDC00-\uD85A\uDFFF",
            "\uD85B\uDC00-\uD85B\uDFFF",
            "\uD85C\uDC00-\uD85C\uDFFF",
            "\uD85D\uDC00-\uD85D\uDFFF",
            "\uD85E\uDC00-\uD85E\uDFFF",
            "\uD85F\uDC00-\uD85F\uDFFF",
            "\uD860\uDC00-\uD860\uDFFF",
            "\uD861\uDC00-\uD861\uDFFF",
            "\uD862\uDC00-\uD862\uDFFF",
            "\uD863\uDC00-\uD863\uDFFF",
            "\uD864\uDC00-\uD864\uDFFF",
            "\uD865\uDC00-\uD865\uDFFF",
            "\uD866\uDC00-\uD866\uDFFF",
            "\uD867\uDC00-\uD867\uDFFF",
            "\uD868\uDC00-\uD868\uDFFF",
            "\uD869\uDC00-\uD869\uDED6"
         };
   }
}